// 在定义函数或类时，如果遇到类型不明确就可以使用泛型
// <T> 就是一个泛型 T可以为其他字母
function fn<T>(a: T): T {
  return a;
}

// 可以直接去调用具有泛型的函数
let reslut = fn(10); // TS会自动推断T的类型为number
let reslut2 = fn<string>("hello"); // 手动指定T的类型为string

function fn2<T, K>(a: T, b: K): T {
  console.log(b);
  return a;
}
// 为多个泛型指定其类型
let result3 = fn2<string, number>("1", 2);

// 限制泛型的范围
interface Inter {
  lengh: number;
}
// T extends Inter 表示泛型T必须是Inter的子类
function fn3<T extends Inter>(a: T): number {
  return a.lengh;
}

fn3({ lengh: 10 });

// 在类中使用泛型
class MyClass<T> {
  name: T; // 不确定name的类型，使用变量表示类型
  constructor(name: T) {
    this.name = name;
  }
}
const mc = new MyClass<string>("张三"); // 在实例化的时候指定泛型T的类型
